#include <iostream>
#include <unistd.h>
#include <pthread.h>

// class TicketMaster
// {
// public:
//     TicketMaster(unsigned int stock = 0) :_stock(stock)
//     {}
//     int AddStock(unsigned int stock)
//     {
//         _stock += stock;
//         return _stock;
//     }
//     int GetStock(unsigned int stock)
//     {
//         int get = std::min(_stock, stock);
//         _stock -= get;
//         printf("剩余票数: %d\n", _stock);
//         return get;
//     }
// private:
//     unsigned int _stock;
// };

// void *start_routine(void* args)
// {
//     TicketMaster *sales = static_cast<TicketMaster *>(args);
//     int count = 0;
//     while(sales->AddStock(0) > 0)
//     {
//         count += sales->GetStock(1);
//         sleep(1);
//     }
//     return (void*)count;
// }

#include "mutex.hpp"
// pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
lbz::mutex mutex;

// void *start_routine(void* args)
// {
//     int *ticket = static_cast<int *>(args);
//     int count = 0;
    
//     bool flag = true;
//     while(flag)
//     {
//         // pthread_mutex_lock(&lock);
//         mutex.lock();
//         if(*ticket > 0)
//         {
//             sleep(1);
//             int left = --(*ticket);
//             printf("抢票成功, 剩余: %d张票\n", left);
//             count++;
//         }
//         else
//             flag = false;
//         // pthread_mutex_unlock(&lock);
//         mutex.unlock();
//         sleep(1);
//     }
    
//     return (void*)count;
// }

void *start_routine(void* args)
{
    int *ticket = static_cast<int *>(args);
    int count = 0;
    
    bool flag = true;
    while(flag)
    {
        // RAII风格的互斥锁实现
        {
            lbz::lockGuard guard(mutex);
            if(*ticket > 0)
            {
                sleep(1);
                int left = --(*ticket);
                printf("抢票成功, 剩余: %d张票\n", left);
                count++;
            }
            else
                flag = false;
        }
        sleep(1);
    }
    
    return (void*)count;
}

int main()
{
    int ticket = 9;
    pthread_t p1, p2;
    pthread_create(&p1, nullptr, start_routine, &ticket);
    pthread_create(&p2, nullptr, start_routine, &ticket);

    int count1, count2;
    pthread_join(p1, (void**)&count1);
    pthread_join(p2, (void**)&count2);
    std::cout << "p1购得票数: " << count1 << "张" << std::endl;
    std::cout << "p2购得票数: " << count2 << "张" << std::endl;
}